package req

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"

	"github.com/go-chi/chi"
)

// 获取Path参数
func Param(r *http.Request, key string, dst interface{}) {
	val := chi.URLParam(r, key)
	if val == "" {
		return
	}
	if json.Unmarshal([]byte(val), dst) == nil {
		return
	}
	if json.Unmarshal([]byte(fmt.Sprintf(`"%s"`, val)), dst) == nil {
		return
	}
}

// 获取Query参数
func Query(r *http.Request, key string, dst interface{}) {
	val := r.URL.Query().Get(key)
	if val == "" {
		return
	}
	if json.Unmarshal([]byte(val), dst) == nil {
		return
	}
	if json.Unmarshal([]byte(fmt.Sprintf(`"%s"`, val)), dst) == nil {
		return
	}
}

// 获取Header参数
func Header(r *http.Request, key string, dst interface{}) {
	val := r.Header.Get(key)
	if val == "" {
		return
	}
	if json.Unmarshal([]byte(val), dst) == nil {
		return
	}
	if json.Unmarshal([]byte(fmt.Sprintf(`"%s"`, val)), dst) == nil {
		return
	}
}

// 获取 Post Json 内容
func Json(r *http.Request, dst interface{}) error {
	b := bytes.NewBuffer(make([]byte, 0))
	reader := io.TeeReader(r.Body, b)
	err := json.NewDecoder(reader).Decode(&dst)
	if err != nil {
		return err
	}
	r.Body = ioutil.NopCloser(b)
	return nil
}

// 获取客户端ip
func IP(r *http.Request) string {
	ip := r.Header.Get("X-Real-Ip")
	if ip == "" {
		ip = r.Header.Get("X-Forwarded-For")
	}
	if ip == "" {
		ip = r.RemoteAddr
	}
	if ip == "::1" {
		ip = "127.0.0.1"
	}
	return ip
}

// 获取当前网址
func Host(r *http.Request) string {
	return r.Host
}
